package com.qen.conditions.update;

import com.qen.common.SqlHelper;
import com.qen.conditions.ChainWrapper;

/**
 * @author licz
 * @data 2025年05月26日 9:10 AM
 */
public interface ChainUpdate<T> extends ChainWrapper<T> {

    /**
     * 更新数据
     * <p>此方法无法进行自动填充,如需自动填充请使用{@link #update(Object)}</p>
     *
     * @return 是否成功
     */
//    default boolean update() {
//        return update(null);
//    }

    /**
     * 更新数据
     *
     * @param entity 实体类(当entity为空时无法进行自动填充)
     * @return 是否成功
     */
//    default boolean update(T entity) {
//        return execute(dao -> SqlHelper.retBool(dao.update(entity, getWrapper())));
//    }

    /**
     * 删除数据
     *
     * @return 是否成功
     */
    default boolean remove() {
        return execute(dao -> SqlHelper.retBool(dao.delete(getWrapper())));
    }

    /**
     * 链式调用
     * <p>
     * 构造方法必须传 class 或 entity 否则会报错 <br />
     * new UpdateJoinWrapper(User.class)<br />
     * JoinWrappers.update(User.class)<br />
     */
    default int update() {
        return SqlHelper.execute(getEntityClass(), dao -> dao.updateJoin(null, getWrapper()));
    }

    /**
     * 链式调用
     * <p>
     * 构造方法必须传 class 或 entity 否则会报错 <br />
     * new UpdateJoinWrapper(User.class)<br />
     * JoinWrappers.update(User.class)<br />
     */
    default int update(T entity) {
        return SqlHelper.execute(getEntityClass(), dao -> dao.updateJoin(entity, getWrapper()));
    }

    /**
     * 链式调用
     * <p>
     * 构造方法必须传 class 或 entity 否则会报错 <br />
     * new UpdateJoinWrapper(User.class)<br />
     * JoinWrappers.update(User.class)<br />
     */
    default int updateAndNull() {
        return SqlHelper.execute(getEntityClass(), dao -> dao.updateJoinAndNull(null, getWrapper()));
    }

    /**
     * 链式调用
     * <p>
     * 构造方法必须传 class 或 entity 否则会报错 <br />
     * new UpdateJoinWrapper(User.class)<br />
     * JoinWrappers.update(User.class)<br />
     */
    default int updateAndNull(T entity) {
        return SqlHelper.execute(getEntityClass(), dao -> dao.updateJoinAndNull(entity, getWrapper()));
    }
}